namespace CSharpPro._1028;

// 用户服务实现类：实现IUserService接口的所有方法
public class UserServiceImpl : IUserService
{
    // 用泛型集合List<User>存储所有用户（包括初始用户）
    private List<User> _users;

    // 构造函数：初始化用户集合，添加预设用户
    public UserServiceImpl()
    {
        _users = new List<User>();
        // 添加初始用户
        _users.Add(new User("admin", "Admin123"));
        _users.Add(new User("test", "Test456"));
    }

    // 显示主菜单
    public static void ShowMenu()
    {
        Console.WriteLine("\n===== 主菜单 =====");
        Console.WriteLine("1. 登录");
        Console.WriteLine("2. 注册");
        Console.WriteLine("3. 退出");
        Console.Write("请选择功能(1-3)：");
    }

    // 登录功能实现
    public void Login()
    {
        Console.WriteLine("\n===== 用户登录 =====");
        Console.Write("请输入用户名：");
        string username = Console.ReadLine()?.Trim();
        Console.Write("请输入密码：");
        string password = Console.ReadLine()?.Trim();

        // 空值验证
        if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
        {
            Console.WriteLine("用户名或密码不可为空！");
            return;
        }

        bool isUserExist = false;
        bool isPasswordRight = false;

        // 用foreach循环遍历用户集合，验证用户名和密码
        foreach (User user in _users)
        {
            if (user.Username == username)
            {
                isUserExist = true;
                if (user.Password == password)
                {
                    isPasswordRight = true;
                }

                break; // 找到对应用户后，跳出循环
            }
        }

        // 判断登录结果
        if (!isUserExist)
        {
            Console.WriteLine("登录失败：用户名不存在");
        }
        else if (!isPasswordRight)
        {
            Console.WriteLine("登录失败：密码错误");
        }
        else
        {
            Console.WriteLine($"登录成功！欢迎回来，{username}！");
            Console.WriteLine("===== 系统首页 =====");
        }
    }

    // 注册功能实现
    public void Regist()
    {
        Console.WriteLine("\n===== 用户注册 =====");
        Console.Write("请设置用户名：");
        string username = Console.ReadLine()?.Trim();
        Console.Write("请设置密码：");
        string password = Console.ReadLine()?.Trim();
        Console.Write("请确认密码：");
        string confirmPwd = Console.ReadLine()?.Trim();

        // 空值验证
        if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(confirmPwd))
        {
            Console.WriteLine("输入不可为空！");
            return;
        }

        // 用户名长度验证（3-15个字符）
        if (username.Length < 3 || username.Length > 15)
        {
            Console.WriteLine("用户名长度必须为3-15个字符！");
            return;
        }

        // 用户名字符验证（只能包含字母、数字、下划线）
        foreach (char c in username)
        {
            if (!char.IsLetterOrDigit(c) && c != '_')
            {
                Console.WriteLine("用户名只能包含字母、数字和下划线！");
                return;
            }
        }

        // 用户名是否已存在（用foreach循环检查）
        foreach (User user in _users)
        {
            if (user.Username == username)
            {
                Console.WriteLine("用户名已存在！");
                return;
            }
        }

        // 密码长度验证（6-20个字符）
        if (password.Length < 6 || password.Length > 20)
        {
            Console.WriteLine("密码长度必须为6-20个字符！");
            return;
        }

        // 密码复杂度验证（至少1个大写、1个小写、1个数字）
        bool hasUpper = false;
        bool hasLower = false;
        bool hasDigit = false;

        foreach (char c in password)
        {
            if (char.IsUpper(c)) hasUpper = true;
            if (char.IsLower(c)) hasLower = true;
            if (char.IsDigit(c)) hasDigit = true;
        }

        if (!hasUpper || !hasLower || !hasDigit)
        {
            Console.WriteLine("密码必须包含至少1个大写字母、1个小写字母和1个数字！");
            return;
        }

        // 密码确认验证
        if (password != confirmPwd)
        {
            Console.WriteLine("两次输入的密码不一致！");
            return;
        }

        // 注册成功，添加到用户集合
        _users.Add(new User(username, password));
        Console.WriteLine("注册成功！已返回主菜单");
    }

    // 程序流程控制（循环显示菜单，处理用户选择）
    public  void Run()
    {
        bool isRunning = true;
        while (isRunning)
        {
            ShowMenu();
            string choice = Console.ReadLine()?.Trim();

            switch (choice)
            {
                case "1":
                    Login();
                    break;
                case "2":
                    Regist();
                    break;
                case "3":
                    isRunning = false;
                    Console.WriteLine("谢谢使用，再见！");
                    break;
                default:
                    Console.WriteLine("无效的选择，请重新输入！");
                    break;
            }
        }
    }
}
